// hdu3530
// 题意：给定n个数，求最大的子区间长度使得最大值与最小值的差小于等于k，
//       大于等于m。
//
// 题解：如果就只有小于等于k的限制就是裸的单调队列，其实加了下限制还一样。
//       每次记录当前单调队维护的区间最左端点，如果大于k，需要处理队首（出队），
//       小于m则不要出队，因为在接下来的时候可能会变成合法的。所以只需要在
//       大于等于m的时候更新答案即可。
//
// 统计：146ms, about 33min, 1re
//
// run: $exec < input
#include <iostream>
#include <deque>

struct data { int v; int p; };

int const maxn = 100100;
int a[maxn];
int n, m, k;

bool illegal(int x)
{
	return x > k;
}

int main()
{
	std::ios::sync_with_stdio(false);
	while (std::cin >> n >> m >> k) {
		for (int i = 1; i <= n; i++) std::cin >> a[i];

		std::deque<data> min;
		std::deque<data> max;
		int ans = 0, left = 0;
		for (int i = 1; i <= n; i++) {
			data tmp; tmp.v = a[i]; tmp.p = i;
			for (; !max.empty() && max.back().v < tmp.v; ) max.pop_back();
			for (; !min.empty() && min.back().v > tmp.v; ) min.pop_back();
			max.push_back(tmp);
			min.push_back(tmp);
			for (; (!max.empty() && !min.empty()) && illegal(max.front().v - min.front().v); )
				if (max.front().p < min.front().p) {
					left = std::max(left, max.front().p);
					max.pop_front();
				} else if (max.front().p > min.front().p) {
					left = std::max(left, min.front().p);
					min.pop_front();
				} else {
					left = std::max(left, min.front().p);
					max.pop_front();
					min.pop_front();
				}
			if ((!max.empty() && !min.empty()) && (max.front().v - min.front().v) >= m)
				ans = std::max(ans, i - left);
		}

		std::cout << ans << '\n';
	}
}

